<?php

if (!function_exists('mydebug')) {
    function mydebug($data)
    {
        throw new \app\common\exception\ApiException(is_array($data) || is_object($data) ? json_encode($data) : $data);
    }
}

if (!function_exists('formatTime')) {
    /**
     * 处理传入的时间并返回指定格式的日期
     *
     * @param mixed $time 传入的时间，可以是10位时间戳、13位时间戳或strtotime可识别的日期格式
     * @param string $format 返回日期的格式（date函数接收的日期格式）
     * @return string 返回格式化后的日期
     */
    function formatTime($time, $format = 'Y-m-d H:i:s'): string
    {
        // 检查是否是纯数字字符串（如 YmdHis 格式）
        if (is_string($time) && preg_match('/^\d+$/', $time)) {
            // 检查长度，判断是 YmdHis 还是时间戳
            if (strlen($time) === 14) { // YmdHis 格式
                $year = substr($time, 0, 4);
                $month = substr($time, 4, 2);
                $day = substr($time, 6, 2);
                $hour = substr($time, 8, 2);
                $minute = substr($time, 10, 2);
                $second = substr($time, 12, 2);

                // 检查日期和时间是否有效
                if (checkdate($month, $day, $year) && $hour < 24 && $minute < 60 && $second < 60) {
                    return date($format, mktime($hour, $minute, $second, $month, $day, $year));
                }
            } elseif (strlen($time) === 10 || strlen($time) === 13) { // 时间戳
                $time = (int)$time;
                if ($time > 9999999999) { // 13位时间戳转换为10位
                    $time /= 1000;
                }
                return date($format, $time);
            }
        }

        // 如果是 strtotime 可识别的日期格式
        $timestamp = strtotime($time);
        if ($timestamp === false) {
            // 如果时间格式无效，返回当前时间
            return date($format);
        }

        return date($format, $timestamp);
    }
}

/**
 * OA系统密码登录
 */
if (!function_exists('oa_password_verify')) {
    function oa_password_verify($password, $hash, $salt = ''): bool
    {
        return md5(md5($password . $salt) . $salt) == $hash;
    }
}

if (!function_exists('company_password_hash')) {
    function company_password_hash($password): string
    {
        return sha1(sha1('blog_') . md5($password) . md5('_encrypt') . sha1($password));
    }
}

if (!function_exists('parseDateRange')) {
    /**
     * 格式化常见时间段, 传入不可识别的时间段, 根据$defaultToToday状态, 默认返回当天的时间段或[null, null]
     *  支持传入时间段，如：2012-12-25 - 2012-12-31
     *  数组['2012-12-25', '2012-12-31']
     *  json字符串['2012-12-25', '2012-12-31']
     *  单日期2012-12-25
     * parseDateRange('2012-12-25');
     * parseDateRange('2012/12/25');
     * parseDateRange('2012.12.25');
     * parseDateRange('12/25/2012');
     * parseDateRange('25.12.2012');
     * parseDateRange('25-12-2012');
     * parseDateRange('December 25, 2012');
     * parseDateRange('25 Dec 2012');
     * @param string $input
     * @param string $delimiter
     * @param bool $defaultToToday
     * @return array
     */
    function parseDateRange($input, $delimiter = ',', $defaultToToday = true, $format = '')
    {
        // 标准化输入为数组
        $dates = [];

        if (is_string($input)) {
            if (str_starts_with(trim($input), '[')) {
                $dates = json_decode($input, true);
                if (!is_array($dates)) {
                    return $defaultToToday ? getTodayRange($format) : [null, null];
                }
            } else {
                $dates = explode($delimiter, $input);
                $dates = array_map('trim', $dates);
            }
        } elseif (is_array($input)) {
            $dates = $input;
        } else {
            return $defaultToToday ? getTodayRange($format) : [null, null];
        }

        // 验证日期数量
        if (count($dates) < 1 || count($dates) > 2) {
            return $defaultToToday ? getTodayRange($format) : [null, null];
        }

        // 解析日期为时间戳
        $parseDate = function ($dateStr) {
            if (empty($dateStr)) {
                return null;
            }

            $timestamp = strtotime($dateStr);
            if ($timestamp === false) {
                return null;
            }

            return $timestamp;
        };

        // 解析日期
        $startDate = $parseDate($dates[0]);
        if ($startDate === null) {
            return $defaultToToday ? getTodayRange($format) : [null, null];
        }

        $endDate = count($dates) > 1 ? $parseDate($dates[1]) : $startDate;
        if ($endDate === null) {
            return $defaultToToday ? getTodayRange($format) : [null, null];
        }

        // 设置时间边界
        $startTimestamp = mktime(0, 0, 0, date('n', $startDate), date('j', $startDate), date('Y', $startDate));
        $endTimestamp = mktime(23, 59, 59, date('n', $endDate), date('j', $endDate), date('Y', $endDate));

        // 确保开始时间 <= 结束时间
        if ($startTimestamp > $endTimestamp) {
            $temp = $startTimestamp;
            $startTimestamp = $endTimestamp;
            $endTimestamp = $temp;
        }

        // 根据format参数格式化返回时间
        if (!empty($format)) {
            $startFormatted = date($format, $startTimestamp);
            $endFormatted = date($format, $endTimestamp);
            return [$startFormatted, $endFormatted];
        }

        return [
            $startTimestamp,
            $endTimestamp
        ];
    }
}


if (!function_exists('getTodayRange')) {
    // 获取当前日期的时间范围
    function getTodayRange($format = '')
    {
        $today = time();
        $start = mktime(0, 0, 0, date('n', $today), date('j', $today), date('Y', $today));
        $end = mktime(23, 59, 59, date('n', $today), date('j', $today), date('Y', $today));
        
        if (!empty($format)) {
            return [date($format, $start), date($format, $end)];
        }
        
        return [$start, $end];
    }
}

if (!function_exists('mydebuglog')) {
    function mydebuglog ($filename = 'debug_log.log', $data = [], $file_append = 1) {
        if (!is_string($data)) {
            $data = var_export($data, true);
        }

        $content = "\n========== ".date("Y-m-d H:i:s")." ==========\n\n";
        $content .= $data;
        $content .= "\n\n=========================================\n\n";

        if ($file_append) {
            file_put_contents($filename, $content, 8);
        } else {
            file_put_contents($filename, $content);
        }
    }
}